#include "FM175xx.h"
#include "type_b.h"
#include "main.h"
#include "format.h"

u32 Rec_len;
u8 Rec_Data[20];
u8 PUPI[4], CardB_Active;	

/*****************************************************************************************
名称：TypeB_WUP																		 
功能：TYPE B卡片唤醒																	 
输入：N/A																				 
输出：	rece_len:卡片应答的数据长度；
		buff：卡片应答的数据指针							 
		card_sn:卡片的PUPI字节															 
	   	TRUE：操作成功																	 
		ERROR：操作失败																	 
*****************************************************************************************/
u8 TypeB_WUP(uint32_t *rece_len,u8 *buff,u8 *card_sn)
{						
	u8 ret,send_byte[3];

	FM175xx_SetTimer(10);

	send_byte[0]=0x05;//APf
	send_byte[1]=0x00;//AFI (00:for all cards)
	send_byte[2]=0x08;//PARAM(WUP,Number of slots =0)

	ret = FM175xx_Comm(Transceive, send_byte, 3, buff, &(*rece_len));

	if (ret != 0)
		memcpy(card_sn, &buff[1], 4);
	
	return (ret);
}
/*****************************************************************************************
名称：TypeB_Select																	 
功能：TYPE B卡片选卡																	 
输入：card_sn：卡片PUPI字节（4字节）													 
输出：	rece_len：应答数据的长度														 
		buff：应答数据的指针															 
	   	TRUE：操作成功																	 
		ERROR：操作失败																	 
*****************************************************************************************/
u8 TypeB_Select(u8 *card_sn,uint32_t *rece_len,u8 *buff)
{
	u8 ret,send_byte[9],i;

	FM175xx_SetTimer(20);

	send_byte[0] = 0x1d;
	for(i = 0; i < 4; i++)
	{
		send_byte[i + 1] =card_sn[i];
	}
	send_byte[5] = 0x00;		//------Param1
	send_byte[6] = 0x08;		//01--24，08--256------Param2
	send_byte[7] = 0x01;		//COMPATIBLE WITH 14443-4------Param3
	send_byte[8] = 0x02;		//CID：01 ------Param4
         
	ret = FM175xx_Comm(Transceive, send_byte, 9, buff, &(*rece_len));
	
	return ret;
}
u8 TypeB_GetUID(u32 *rece_len,u8 *buff)
{
	u8 ret,send_byte[5];
		FM175xx_SetTimer(15);
		send_byte[0]=0x00;
		send_byte[1]=0x36;
		send_byte[2]=0x00;
		send_byte[3]=0x00;
		send_byte[4]=0x08;
		ret=FM175xx_Comm(Transceive,send_byte,5,buff,&(*rece_len));
		
		return (ret);
}
/*****************************************************************************************
名称：ReadCard_TypeBActive																	 
功能：TYPE B卡片读卡ID																	 
输入：card_sn：卡片PUPI字节（4字节）													 
输出：	rece_len：应答数据的长度														 
		buff：应答数据的指针															 
	   	TRUE：操作成功																	 
		ERROR：操作失败																	 
*****************************************************************************************/
u8 ReadCard_TypeBActive(u8 *csn,u8 *csn_len)
{
	u8 i,rlen;
	
//	FM175xx_SoftReset();
//	FM175xx_Set_Rf(OPEN_ALL_TX);   								//turn on radio
//	FM175xx_ConfigISOType(ISO_Cfg_TYPE_B);				//设置TypeB
//	delay_ms(100);

	if(TypeB_WUP(&Rec_len,Rec_Data,csn) != 0)		//寻卡 Standard	 send request command Standard mode
	{
		rlen = Rec_len/8;
		if(rlen > 10)
		{
			if(CardB_Active == 1)
				return 0;
		#if DEBUG > 0
			printf("B_wup=%d: ", rlen);
			for(i=0;i<rlen;i++)
				printf("%02X", Rec_Data[i]);
			printf("\r\n");
		#endif
			if(TypeB_Select(csn,&Rec_len,Rec_Data) != 0)
			{
				rlen = Rec_len/8;
				if(rlen > 0)
				{
				#if DEBUG > 0
					printf("B_select=%d: ", rlen);
					for(i=0;i<rlen;i++)
						printf("%02X", Rec_Data[i]);
					printf("\r\n");
				#endif
					if(TypeB_GetUID(&Rec_len,Rec_Data) != 0)
					{
						rlen = Rec_len/8;
						if(rlen > 8)
						{
						#if DEBUG > 0
							printf("B_uid=%d: ", rlen);
							for(i=0;i<rlen;i++)
								printf("%02X", Rec_Data[i]);
							printf("\r\n");
						#endif
							memcpy(csn, Rec_Data, 8);
							*csn_len = 8;
							CardB_Active = 1;
							return 1;
						}
					}
				}
			}
		}
		else
		{
			CardB_Active = 0;
		}
	}

	return 0;
}
